/*
 * Licensed to Jasig under one or more contributor license agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership. Jasig licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy
 * of the License at the following location:
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.baijia.web.extractor;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springframework.web.util.CookieGenerator;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Extends CookieGenerator to allow you to retrieve a value from a request.
 * <p>
 * Also has support for RememberMe Services
 * 
 * @author Scott Battaglia
 * @version $Revision: 1.1 $ $Date: 2005/08/19 18:27:17 $
 * @since 3.1
 *
 */
public class CookieRetrievingCookieGenerator extends CookieGenerator {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    public static final String REQUEST_PARAMETER_REMEMBER_ME = "BAIJIAHULIAN_PASSPORT";

    private final String USER_PASSPORT_COOKIE_NAME = "_user_const_passport_id_";

    /**
     * The maximum age the cookie should be remembered for. The default is three months (7889231 in seconds, according
     * to Google)
     */
    private int rememberMeMaxAge = 2592000;

    public void addCookie(final HttpServletRequest request, final HttpServletResponse response, final String cookieValue) {
        // if (!StringUtils.hasText(request.getParameter(REQUEST_PARAMETER_REMEMBER_ME))) {
        // super.addCookie(response, cookieValue);
        // } else {
        // for (String domain:getCookieDomains()){
        // final Cookie cookie = createCookie(cookieValue, domain);
        // cookie.setMaxAge(this.rememberMeMaxAge);
        // if (isCookieSecure()) {
        // cookie.setSecure(true);
        // }
        // response.addCookie(cookie);
        // }
        //
        // }
        for (String domain : getCookieDomains()) {
            final Cookie cookie = createCookie(cookieValue, domain);
            cookie.setMaxAge(this.rememberMeMaxAge);
            if (isCookieSecure()) {
                cookie.setSecure(true);
            }
            response.addCookie(cookie);
        }
    }

    public void addUserCookie(final HttpServletRequest request, final HttpServletResponse response,
        final String cookieValue) {
        // if (!StringUtils.hasText(request.getParameter(REQUEST_PARAMETER_REMEMBER_ME))) {
        // super.addCookie(response, cookieValue);
        // } else {
        // for (String domain:getCookieDomains()){
        // final Cookie cookie = createCookie(cookieValue, domain);
        // cookie.setMaxAge(this.rememberMeMaxAge);
        // if (isCookieSecure()) {
        // cookie.setSecure(true);
        // }
        // response.addCookie(cookie);
        // }
        //
        // }
        for (String domain : getCookieDomains()) {
            final Cookie cookie = createUserCookie(cookieValue, domain);
            cookie.setMaxAge(this.rememberMeMaxAge);
            if (isCookieSecure()) {
                cookie.setSecure(true);
            }
            response.addCookie(cookie);
        }
    }

    public String retrieveCookieValue(final HttpServletRequest request) {
        final Cookie cookie = org.springframework.web.util.WebUtils.getCookie(request, getCookieName());

        return cookie == null ? null : cookie.getValue();
    }

    public String retrieveUserCookieValue(final HttpServletRequest request) {
        final Cookie cookie = org.springframework.web.util.WebUtils.getCookie(request, USER_PASSPORT_COOKIE_NAME);

        return cookie == null ? null : cookie.getValue();
    }

    public void setRememberMeMaxAge(final int maxAge) {
        this.rememberMeMaxAge = maxAge;
    }

    public void removeCookie(HttpServletResponse response) {
        Assert.notNull(response, "HttpServletResponse must not be null");
        for (String domain : getCookieDomains()) {
            Cookie cookie = createCookie("", domain);
            cookie.setMaxAge(0);
            logger.info("Clear dession cookie {}", ToStringBuilder.reflectionToString(cookie));
            response.addCookie(cookie);
        }
    }

    public void removeUserCookie(HttpServletResponse response) {
        Assert.notNull(response, "HttpServletResponse must not be null");
        for (String domain : getCookieDomains()) {
            Cookie cookie = createUserCookie("", domain);
            cookie.setMaxAge(0);
            logger.info("Clear dession cookie {}", ToStringBuilder.reflectionToString(cookie));
            response.addCookie(cookie);
        }
    }

    protected Cookie createCookie(String cookieValue, String domain) {
        Cookie cookie = new Cookie(getCookieName(), cookieValue);
        if (org.apache.commons.lang.StringUtils.isNotBlank(domain)) {
            cookie.setDomain(domain);
        } else if (getCookieDomain() != null) {
            cookie.setDomain(getCookieDomain());
        }
        cookie.setPath(getCookiePath());
        return cookie;
    }

    protected Cookie createUserCookie(String cookieValue, String domain) {
        Cookie cookie = new Cookie(USER_PASSPORT_COOKIE_NAME, cookieValue);
        if (org.apache.commons.lang.StringUtils.isNotBlank(domain)) {
            cookie.setDomain(domain);
        } else if (getCookieDomain() != null) {
            cookie.setDomain(getCookieDomain());
        }
        cookie.setPath(getCookiePath());
        return cookie;
    }

    public String[] getCookieDomains() {
        String cookieDomain = getCookieDomain();
        if (org.apache.commons.lang.StringUtils.isNotBlank(cookieDomain)) {

            return cookieDomain.split(",");
        } else {
            return new String[] {};
        }
    }
}
